﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Windows.Forms;
using Neturion.Utils.TratamentoErros;

namespace Neturion.Utils.GerenciamentoBoletos
{
    public class GeracaoBoleto
    {
        private Dados.Titulo _titulo;
        private Dados.Pessoa _sacado;
        private Dados.ContaBanco _contaBanco;
        private Dados.FormaPagamento _formaPagamento;
        private decimal _valor;
        private Dados.MovimentoFinanceiro _movimentoFinanceiro;
        private BoletoNet.Boleto _boleto;
        private List<BoletoNet.BoletoBancario> _listaBoletosBancario;
        
        public GeracaoBoleto()
        {

        }

        public GeracaoBoleto(Dados.Titulo titulo, Dados.Pessoa sacado, Dados.ContaBanco contaBanco, Dados.FormaPagamento formaPagamento, decimal valor)
        {
            _titulo = titulo;
            _sacado = sacado;
            _contaBanco = contaBanco;
            _formaPagamento = formaPagamento;
            _valor = valor;
            if(titulo != null)
            {
                _movimentoFinanceiro = titulo.MovimentoFinanceiro;
            }

            _listaBoletosBancario = new List<BoletoNet.BoletoBancario>();
        }

        public GeracaoBoleto(Dados.MovimentoFinanceiro movimentoFinanceiro, Dados.Pessoa sacado, Dados.ContaBanco contaBanco, decimal valor)
        {
            _movimentoFinanceiro = movimentoFinanceiro;
            _sacado = sacado;
            _contaBanco = contaBanco;
            _valor = valor;

            _listaBoletosBancario = new List<BoletoNet.BoletoBancario>();
        }
        

        public Dados.Titulo Titulo
        {
            private get { return _titulo; }
            set { _titulo = value; }
        }

        public Dados.Pessoa Sacado
        {
            private get { return _sacado; }
            set { _sacado = value; }
        }

        public Dados.ContaBanco ContaBanco
        {
            private get { return _contaBanco; }
            set { _contaBanco = value; }
        }

        public Dados.MovimentoFinanceiro MovimentoFinanceiro
        {
            private get { return _movimentoFinanceiro; }
            set { _movimentoFinanceiro = value; }
        }

        public List<BoletoNet.BoletoBancario> ListaBoletosBancario
        {
            get { return _listaBoletosBancario; }
            set { _listaBoletosBancario = value; }
        }

        public Dados.FormaPagamento FormaPagamento
        {
            get { return _formaPagamento; }
            set { _formaPagamento = value; }
        }


        public string GerarBoletoArquivo()
        {
            GerarBoletos();
            return GeraLayout(_listaBoletosBancario);
            //return GeraBoletoCaixa(3);
        }

        private void GerarBoletos()
        {
            //foreach (Dados.Titulo titulo in _movimentoFinanceiro.ListaTitulos.Cast<Dados.Titulo>()
            //                                                                    .Where(titulo => titulo.ListaPagamentos != null 
            //                                                                              && titulo.ListaPagamentos.Cast<Dados.Pagamento>().Sum(pagamento => pagamento.Valor) < titulo.Valor))
            //{
            //    _titulo = titulo;
                _listaBoletosBancario.Add(CriarBoleto());
            //}
        }

        private BoletoNet.BoletoBancario CriarBoleto()
        {
            BoletoNet.BoletoBancario boletoBancario;
            try
            {
                if (_titulo == null)
                {
                    throw new Exception("Não há um Título para o Boleto!");
                }

                if (_contaBanco == null)
                {
                    throw new Exception("Não há uma Conta Banco para o Boleto!");
                }

                if (_contaBanco.Titular == null)
                {
                    throw new Exception("Não há um Cedente para o Boleto!");
                }

                if (_sacado == null)
                {
                    throw new Exception("Não há um Sacado para o Boleto!");
                }

                if (_formaPagamento == null)
                {
                    throw new Exception("Não há um Pagamento para o Boleto!");
                }

                _boleto = new BoletoNet.Boleto();

                if (_formaPagamento != null)
                {
                    _boleto.Aceite = (_formaPagamento.Aceite == Dados.EnumAceiteFormaPagamento.Sim ? "S" : "N");
                    _boleto.Carteira = _formaPagamento.Carteira;
                    _boleto.LocalPagamento = _formaPagamento.LocalPagamento;
                }

                BoletoNet.IInstrucao instrucao = CriarInstrucao(_contaBanco);
                instrucao.Descricao = _titulo.Historico;

                _boleto.Abatimento = _titulo.Desconto.GetValueOrDefault();
                _boleto.Banco = instrucao.Banco;
                _boleto.Cedente = CriarCedente(_contaBanco.Titular);
                _boleto.ContaBancaria = _boleto.Cedente.ContaBancaria;
                _boleto.DataDocumento = _titulo.DataEmissao;
                _boleto.DataProcessamento = _titulo.DataEmissao;
                _boleto.DataVencimento = _titulo.DataVencimento;
                _boleto.JurosMora = _titulo.JurosTaxas.GetValueOrDefault();
                _boleto.Instrucoes.Add(instrucao);
                _boleto.NossoNumero = _titulo.MovimentoId.ToString().PadLeft(_formaPagamento.TamanhoNossoNumero, '0');
                _boleto.NumeroDocumento = _titulo.Documento;
                _boleto.Sacado = CriarSacado(_sacado);
                _boleto.ValorMulta = _titulo.Multa.GetValueOrDefault();
                _boleto.ValorBoleto = _valor;

                //_boleto.Categoria
                //_boleto.DataDesconto
                //_boleto.DataJurosMora
                //_boleto.DataMulta
                //_boleto.DataOutrosAcrescimos
                //_boleto.DataOutrosDescontos
                //_boleto.DigitoNossoNumero
                //_boleto.Especie
                //_boleto.EspecieDocumento = new BoletoNet.EspecieDocumento_Caixa();
                //_boleto.IOF
                //_boleto.LocalPagamento
                //_boleto.Moeda
                //_boleto.NumeroParcela
                //_boleto.OutrosAcrescimos
                //_boleto.OutrosDescontos
                //_boleto.PercJurosMora
                //_boleto.PercMulta
                //_boleto.QuantidadeMoeda
                //_boleto.TipoModalidade
                //_boleto.UsoBanco
                //_boleto.ValorCobrado
                //_boleto.ValorDesconto
                //_boleto.ValorMoeda


                //_boleto.FormataCampos();
                _boleto.Valida();

                boletoBancario = new BoletoNet.BoletoBancario();
                boletoBancario.CodigoBanco = Convert.ToInt16(_boleto.Banco.Codigo);
                boletoBancario.Boleto = _boleto;
            }
            catch (Exception exception)
            {
                string erro = TratamentoExcecoes.TratarRecursaoExcecao(exception);
                throw new Exception(erro);
            }

            return boletoBancario;
        }

        private string GeraBoletoCaixa(int qtde)
        {
            // Cria o boleto, e passa os parâmetros usuais
            BoletoNet.BoletoBancario bb;

            List<BoletoNet.BoletoBancario> boletos = new List<BoletoNet.BoletoBancario>();
            for (int i = 0; i < qtde; i++)
            {
                bb = new BoletoNet.BoletoBancario();
                bb.CodigoBanco = 104;

                DateTime vencimento = new DateTime(2010, 2, 28);

                BoletoNet.Instrucao_Caixa item1 = new BoletoNet.Instrucao_Caixa(9, 5);
                BoletoNet.Instrucao_Caixa item2 = new BoletoNet.Instrucao_Caixa(81, 10);
                BoletoNet.Cedente c = new BoletoNet.Cedente("00.000.000/0000-00", "Empresa de Atacado", "0132", "00542");

                BoletoNet.Boleto b = new BoletoNet.Boleto(vencimento, 460, "SR", "00000000010001", c);
                b.NumeroDocumento = Convert.ToString(1000 + i);

                b.Sacado = new BoletoNet.Sacado("000.000.000-00", "Fulano de Silva");
                b.Sacado.Endereco.End = "SSS 154 Bloco J Casa 23ddddddddddddddddddddddddddd";
                b.Sacado.Endereco.Bairro = "Testando";
                b.Sacado.Endereco.Cidade = "Testelândia";
                b.Sacado.Endereco.CEP = "70000000";
                b.Sacado.Endereco.UF = "DF";

                item2.Descricao += " " + item2.QuantidadeDias.ToString() + " dias corridos do vencimento.";
                b.Instrucoes.Add(item1);
                b.Instrucoes.Add(item2);

                // juros/descontos

                if (b.ValorDesconto == 0)
                {
                    BoletoNet.Instrucao_Caixa item3 = new BoletoNet.Instrucao_Caixa(999, 1);
                    item3.Descricao += ("1,00 por dia de antecipação.");
                    b.Instrucoes.Add(item3);
                }

                bb.Boleto = b;
                bb.Boleto.Valida();

                boletos.Add(bb);
            }

            return GeraLayout(boletos);
        }

        private string GeraLayout(List<BoletoNet.BoletoBancario> boletos)
        {
            StringBuilder html = new StringBuilder();
            foreach (BoletoNet.BoletoBancario boletoBancario in boletos)
            {
                html.Append(boletoBancario.MontaHtml());
                html.Append("</br></br></br></br>");
            }
            
            string arquivo = Path.GetTempFileName();
            arquivo = Path.ChangeExtension(arquivo, "html");
            using (FileStream f = new FileStream(arquivo, FileMode.Create))
            {
                StreamWriter w = new StreamWriter(f, Encoding.Default);
                w.Write(html.ToString());
                w.Close();
                f.Close();
            }

            //string path = HttpContext.Current.Server.MapPath(@"~/Boletos/");
            //Directory.CreateDirectory(path);
            //File.Copy(arquivo, path + Path.GetFileName(arquivo));

            //File.Delete(arquivo);
            //arquivo = path + Path.GetFileName(arquivo);

            //CriarArquivo.CriarPdf(arquivo);
            ////CriarArquivo.HtmlToPdf(arquivo, html.ToString());

            //CriarArquivo.ExluirArquivo(Path.ChangeExtension(arquivo, "tmp"));
            //CriarArquivo.ExluirArquivo(Path.ChangeExtension(arquivo, "html"));
            //CriarArquivo.ExluirArquivo(Path.ChangeExtension(arquivo, "bmp"));
            
            //arquivo = Path.ChangeExtension(arquivo, "pdf");
            return arquivo;
        }

        private BoletoNet.Cedente CriarCedente(Dados.Pessoa pessoa)
        {
            BoletoNet.Cedente cedente = new BoletoNet.Cedente();
            cedente.CPFCNPJ = pessoa.CpfCnpj;
            cedente.Codigo = pessoa.PessoaId;
            cedente.Nome = pessoa.NomeRazaoSocial;
            cedente.Convenio = Convert.ToInt32(_formaPagamento.Convenio);
            cedente.ContaBancaria = CriarContaBancaria(_contaBanco);
            cedente.Endereco = CriarEndereco(pessoa);
            
            return cedente;
        }

        //TODO: Falta dados
        private BoletoNet.Sacado CriarSacado(Dados.Pessoa pessoa)
        {
            BoletoNet.Sacado sacado = new BoletoNet.Sacado();
            sacado.CPFCNPJ = pessoa.CpfCnpj;
            sacado.Nome = pessoa.NomeRazaoSocial;
            sacado.Endereco = CriarEndereco(pessoa);
            //sacado.InformacoesSacado = 

            return sacado;
        }

        private BoletoNet.ContaBancaria CriarContaBancaria(Dados.ContaBanco contaBanco)
        {
            BoletoNet.ContaBancaria contaBancaria = new BoletoNet.ContaBancaria();

            if (contaBanco.Agencia != null)
            {
                contaBancaria.Agencia = contaBanco.Agencia.NumeroAgencia;
                //contaBancaria.DigitoAgencia = contaBanco.Agencia.NumeroAgencia.Substring(contaBanco.Agencia.NumeroAgencia.Length - 1);
            }

            contaBancaria.Conta = contaBanco.NumeroConta.Substring(0, contaBanco.NumeroConta.Length - 1);
            contaBancaria.DigitoConta = contaBanco.NumeroConta.Substring(contaBanco.NumeroConta.Length - 1);

            return contaBancaria;
        }

        //TODO: Verificar Emails
        private BoletoNet.Endereco CriarEndereco(Dados.Pessoa pessoa)
        {
            BoletoNet.Endereco enderecoBoleto = null;
            if (pessoa.ListaEnderecos != null && pessoa.ListaEnderecos.Count > 0)
            {
                Dados.Endereco endereco = pessoa.ListaEnderecos[0] as Dados.Endereco;

                enderecoBoleto = new BoletoNet.Endereco();

                enderecoBoleto.Complemento = endereco.Complemento;
                enderecoBoleto.Numero = endereco.Numero;

                if (endereco.Logradouro != null)
                {
                    enderecoBoleto.CEP = endereco.Logradouro.Cep;
                    enderecoBoleto.End = endereco.Logradouro.Descricao;

                    if (endereco.Logradouro.Bairro != null)
                    {
                        enderecoBoleto.Bairro = endereco.Logradouro.Bairro.Descricao;

                        if (endereco.Logradouro.Bairro.Cidade != null)
                        {
                            enderecoBoleto.Cidade = endereco.Logradouro.Bairro.Cidade.Descricao;

                            if (endereco.Logradouro.Bairro.Cidade.UnidadeFederativa != null)
                            {
                                enderecoBoleto.UF = endereco.Logradouro.Bairro.Cidade.UnidadeFederativa.Sigla;
                            }
                        }
                    }
                }

                if (endereco.Pessoa.ListaEmails != null && endereco.Pessoa.ListaEmails.Count >= 0)
                {
                    var email = endereco.Pessoa.ListaEmails[0] as Dados.Email;
                    if (email != null)
                    {
                        enderecoBoleto.Email = email.Descricao;
                    }
                }
            }

            return enderecoBoleto;
        }

        private BoletoNet.IInstrucao CriarInstrucao(Dados.ContaBanco contaBanco)
        {
            BoletoNet.IInstrucao instrucao;
            switch (Convert.ToInt32(contaBanco.Agencia.Banco.CodigoCompensacao))
            {
                    //104 - Caixa
                case 104:
                    instrucao = new BoletoNet.Instrucao_Caixa();
                    break;
                    //341 - Itaú
                case 341:
                    instrucao = new BoletoNet.Instrucao_Itau();
                    break;
                    //356 - Real
                case 275:
                case 356:
                    instrucao = new BoletoNet.Instrucao_Real();
                    break;
                    //422 - Safra
                case 422:
                    instrucao = new BoletoNet.Instrucao_Safra();
                    break;
                    //237 - Bradesco
                case 237:
                    instrucao = new BoletoNet.Instrucao_Bradesco();
                    break;
                    //347 - Sudameris
                case 347:
                    instrucao = new BoletoNet.Instrucao_Sudameris();
                    break;
                    //353 - Santander
                case 353:
                    instrucao = new BoletoNet.Instrucao_Santander();
                    break;
                    //070 - BRB
                case 70:
                    instrucao = new BoletoNet.Instrucao_BRB();
                    break;
                    //479 - BankBoston
                case 479:
                    instrucao = new BoletoNet.Instrucao_BankBoston();
                    break;
                    //001 - Banco do Brasil
                case 1:
                    instrucao = new BoletoNet.Instrucao_BancoBrasil();
                    break;
                    //399 - HSBC
                case 399:
                    instrucao = new BoletoNet.Instrucao(399);
                    break;
                    //003 - HSBC
                case 3:
                    instrucao = new BoletoNet.Instrucao(3);
                    break;
                    //409 - Unibanco
                case 409:
                    instrucao = new BoletoNet.Instrucao(409);
                    break;
                    //33 - Unibanco
                case 33:
                    instrucao = new BoletoNet.Instrucao_Santander();
                    break;
                    //41 - Banrisul
                case 41:
                    instrucao = new BoletoNet.Instrucao_Banrisul();
                    break;
                    //756 - Sicoob (Bancoob)
                case 756:
                    instrucao = new BoletoNet.Instrucao(756);
                    break;
                default:
                    throw new Exception("Código do banco não implementando: " + contaBanco.Agencia.Banco.CodigoCompensacao);
            }

            return instrucao;
        }
        
        public void CriarArquivoRemessa(IList<Dados.Titulo> listaTitulos, int tipoArquivo)
        {
            try
            {
                if (!tipoArquivo.Equals(240) || !tipoArquivo.Equals(400))
                {
                    throw new Exception("O Tipo do Arquivo de Remessa é inválido!" + Environment.NewLine +
                                        "Os tipos permitidos são CNAB 240 ou CNAB 400.");
                }

                SaveFileDialog saveFileDialog = new SaveFileDialog
                {
                    Filter = "Arquivos de Retorno (*.rem)|*.rem|Todos Arquivos (*.*)|*.*"
                };

                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    BoletoNet.ArquivoRemessa arquivo;
                    BoletoNet.Boletos boletos = new BoletoNet.Boletos(); ;
                    BoletoNet.BoletoBancario boletoBancario;
                    foreach (Dados.Titulo titulo in listaTitulos)
                    {
                        _titulo = titulo;
                        boletoBancario = CriarBoleto();

                        boletos.Add(boletoBancario.Boleto);
                    }

                    BoletoNet.IBanco banco = boletos.First().Banco;
                    BoletoNet.Cedente cedente = boletos.First().Cedente;

                    if (tipoArquivo.Equals(240))
                    {
                        arquivo = new BoletoNet.ArquivoRemessa(BoletoNet.TipoArquivo.CNAB240);
                        arquivo.GerarArquivoRemessa(cedente.Convenio.ToString(), banco, cedente, boletos, saveFileDialog.OpenFile(), 1);
                    }
                    else
                    {
                        arquivo = new BoletoNet.ArquivoRemessa(BoletoNet.TipoArquivo.CNAB240);
                        arquivo.GerarArquivoRemessa(cedente.Convenio.ToString(), banco, cedente, boletos, saveFileDialog.OpenFile(), 1);
                    }

                    MessageBox.Show("Arquivo gerado com sucesso!", "Neturion Solutions", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (Exception exception)
            {
                string erro = TratamentoExcecoes.TratarRecursaoExcecao(exception);
                throw new Exception(erro);
            }
            
        }

        public void LerRetorno(int codigoBanco, int tipoArquivo)
        {
            try
            {
                BoletoNet.Banco bco = new BoletoNet.Banco(codigoBanco);
                
                OpenFileDialog openFileDialog = new OpenFileDialog
                    {
                        FileName = "",
                        Title = "Selecione um arquivo de retorno",
                        Filter = "Arquivos de Retorno (*.ret;*.crt)|*.ret;*.crt|Todos Arquivos (*.*)|*.*"
                    };

                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    if (tipoArquivo.Equals(400))
                    {
                        BoletoNet.ArquivoRetornoCNAB400 cnab400 = null;
                        if (openFileDialog.CheckFileExists)
                        {
                            cnab400 = new BoletoNet.ArquivoRetornoCNAB400();
                            cnab400.LinhaDeArquivoLida += new EventHandler<BoletoNet.LinhaDeArquivoLidaArgs>(cnab400_LinhaDeArquivoLida);
                            cnab400.LerArquivoRetorno(bco, openFileDialog.OpenFile());
                        }

                        if (cnab400 == null)
                        {
                            throw new Exception("Arquivo não processado!");
                        }

                        foreach (BoletoNet.DetalheRetorno detalhe in cnab400.ListaDetalhe)
                        {
                            ListViewItem li = new ListViewItem(detalhe.NomeSacado.Trim());
                            li.Tag = detalhe;

                            li.SubItems.Add(detalhe.DataVencimento.ToString("dd/MM/yy"));
                            li.SubItems.Add(detalhe.DataCredito.ToString("dd/MM/yy"));

                            li.SubItems.Add(detalhe.ValorTitulo.ToString("###,###.00"));

                            li.SubItems.Add(detalhe.ValorPago.ToString("###,###.00"));
                            li.SubItems.Add(detalhe.CodigoOcorrencia.ToString());
                            li.SubItems.Add("");
                            li.SubItems.Add(detalhe.NossoNumero);
                        }
                    }
                    else if (tipoArquivo.Equals(240))
                    {
                        BoletoNet.ArquivoRetornoCNAB240 cnab240 = null;
                        if (openFileDialog.CheckFileExists)
                        {
                            cnab240 = new BoletoNet.ArquivoRetornoCNAB240();
                            cnab240.LinhaDeArquivoLida += new EventHandler<BoletoNet.LinhaDeArquivoLidaArgs>(cnab240_LinhaDeArquivoLida);
                            cnab240.LerArquivoRetorno(bco, openFileDialog.OpenFile());
                        }
                            
                        if (cnab240 == null)
                        {
                            throw new Exception("Arquivo não processado!");
                        }
                        
                        foreach (BoletoNet.DetalheRetornoCNAB240 detalhe in cnab240.ListaDetalhes)
                        {
                            ListViewItem li = new ListViewItem(detalhe.SegmentoT.NomeSacado.Trim());
                            li.Tag = detalhe;

                            li.SubItems.Add(detalhe.SegmentoT.DataVencimento.ToString("dd/MM/yy"));
                            li.SubItems.Add(detalhe.SegmentoU.DataCredito.ToString("dd/MM/yy"));
                            li.SubItems.Add(detalhe.SegmentoT.ValorTitulo.ToString("###,###.00"));
                            li.SubItems.Add(detalhe.SegmentoU.ValorPagoPeloSacado.ToString("###,###.00"));
                            li.SubItems.Add(detalhe.SegmentoU.CodigoOcorrenciaSacado);
                            li.SubItems.Add("");
                            li.SubItems.Add(detalhe.SegmentoT.NossoNumero);
                        }
                    }
                    MessageBox.Show("Arquivo aberto com sucesso!");
                }
            }
            catch (Exception exception)
            {
                string erro = TratamentoExcecoes.TratarRecursaoExcecao(exception);
                throw new Exception(erro);
            }
        }

        void cnab240_LinhaDeArquivoLida(object sender, BoletoNet.LinhaDeArquivoLidaArgs e)
        {
            
        }

        void cnab400_LinhaDeArquivoLida(object sender, BoletoNet.LinhaDeArquivoLidaArgs e)
        {
            
        }
    
        //public static string CalcularNossoNumero(string numero, int modulo)
        //{
        //    string nossoNumero = string.Empty;
        //    int digitoVerificador = 0;

        //    if(string.IsNullOrEmpty(numero) || !(modulo.Equals(10) || modulo.Equals(11)))
        //    {
        //        throw new Exception("Erro ao calcular o dígito verificador do Nosso Número do Título" + Environment.NewLine +
        //                            "Número inconsistente ou Módulo inválido!");
        //    }

        //    #region Explicação do Calculo
        //    /*Modulo 11 :
        //     ex: 5555555555-8//digito verificador é o 8 
        //     multiplica-se cada digito do numero de 2 à 9 , da direita para a esquerda somando cada resultado  
        //     (5 * 3) + (5 * 2) + (5 * 9) + (5 * 8) + (5 * 7) + (5 * 6) + (5 * 5) + (5 * 4) + (5 * 3) + (5 * 2) = 245;
        //     calcula o módulo 11 do resultado da soma  
        //     245 % 11 = 3;
        //     Se o modulo for igual a 0 ou 1 o digito verificador será 0  
        //     se o modulo for maior que 1 deve-se diminuir de 11  
        //      11 - 3 = 8;  digito verificador é 8  */

        //    /*Modulo 10 : 
        //     ex: 5555555555-5 
        //     multiplica-se cada digito do numero por 2 alternadamente, da direita para a esquerda  
        //     5+(5*2)+5+(5*2)+5+(5*2)+5+(5*2)+5+(5*2) = 75;  
        //     calcula o modulo 10 do resultado da soma  
        //     75 % 10 = 5  
        //     Se o modulo for igual a 0 o digito verificador será 0  
        //     se for maior que 0 deve-se diminuir de 10  
        //     10 - 5 = 5; digito verificador é 5  */
        //    #endregion

        //    switch (modulo)
        //    {
        //        case 11:
        //            {
        //                digitoVerificador = (Convert.ToInt32(numero.Substring(1, 1)) * 3) + (Convert.ToInt32(numero.Substring(2, 1)) * 2) +
        //                                    (Convert.ToInt32(numero.Substring(3, 1)) * 9) + (Convert.ToInt32(numero.Substring(4, 1)) * 8) +
        //                                    (Convert.ToInt32(numero.Substring(5, 1)) * 7) + (Convert.ToInt32(numero.Substring(6, 1)) * 6) +
        //                                    (Convert.ToInt32(numero.Substring(7, 1)) * 5) + (Convert.ToInt32(numero.Substring(8, 1)) * 4) +
        //                                    (Convert.ToInt32(numero.Substring(9, 1)) * 3) + (Convert.ToInt32(numero.Substring(10, 1)) * 2);
                        
        //                digitoVerificador = digitoVerificador % 11;
        //                digitoVerificador = 11 - digitoVerificador;

        //                break;
        //            }
        //        case 10:
        //            {
        //                digitoVerificador = Convert.ToInt32(numero.Substring(1, 1)) + (Convert.ToInt32(numero.Substring(2, 1)) * 2) +
        //                                    Convert.ToInt32(numero.Substring(3, 1)) + (Convert.ToInt32(numero.Substring(4, 1)) * 2) +
        //                                    Convert.ToInt32(numero.Substring(5, 1)) + (Convert.ToInt32(numero.Substring(6, 1)) * 2) +
        //                                    Convert.ToInt32(numero.Substring(7, 1)) + (Convert.ToInt32(numero.Substring(8, 1)) * 2) +
        //                                    Convert.ToInt32(numero.Substring(9, 1)) + (Convert.ToInt32(numero.Substring(10, 1)) * 2);

        //                digitoVerificador = digitoVerificador % 10;
        //                digitoVerificador = 10 - digitoVerificador;

        //                break;
        //            }
        //        default:
        //            {
        //                break;
        //            }
        //    }

        //    return nossoNumero + '-' + digitoVerificador;
        //}
    }
}